import jsonpath

from base.jsontools import json_read

"""
    $ 表示文档的根元素
    @ 表示文档的当前元素
    .node_name 或 [‘node_name’] 匹配下级节点
    [index] 检索数组中的元素
    [start : end : step] 支持数组切片语法
    * 作为通配符，匹配所有成员
    … 子递归通配符，匹配成员的所有子元素
    () 使用表达式
    ?()进行数据筛选
    
    示例：
    '$.store.booke[*].author'   所有book的author节点
    '$..author'
    '$.store.*' store下的所有节点，book数组和bicycle节点
    '$.store..price'    
    '$...book[2]'   匹配第三个book节点
    '$...book[-1:]' 匹配倒数第一个book节点
    '$...book[0,1]' 匹配前两个book节点
    '$...book[?(@.isbn)]'   过滤含isbn的节点
    '$...book[?(@.price<10)]'   过滤price<10的节点
    '$...*' 递归匹配所有子节点
"""


# jsonpath数据获取:写一个通用的获取方式，可以自定义其他的获取方式
def key_get(json_data, key):
    """
    获取json数据中的key值
    :param json_data:
    :param key:
    :return: 目标key的value值
    """
    # 实际情况中，获取规则可以针对性优化
    value = jsonpath.jsonpath(json_data, '$..{0}'.format(key))
    # 如果不为False
    if value:
        # 如果获取的值长度是1
        if len(value) == 1:
            return value[0]
        else:
            return value
    else:
        return value


def key_get1(json_data, key1, key2):
    """
    获取json数据中的key值
    :param json_data:
    :param key:
    :return: 目标key的value值
    """
    # 实际情况中，获取规则可以针对性优化
    value = jsonpath.jsonpath(json_data, '$..{0}.{1}'.format(key1, key2))
    # 如果不为False
    if value:
        # 如果获取的值长度是1
        if len(value) == 1:
            return value[0]
        else:
            return value
    else:
        return value


if __name__ == '__main__':
    values = key_get(json_read('../data/apidata.json'), 'deviceId')
    print(values)
    for value in values:
        print(value)
